package io;

import java.io.*;

/**
 * 关于高效的字节缓冲流对字节输入输出流（数据的读写）的效率的对比可以从如下几个实例中得道很清晰的答案
 *
 * 需求：将目录F：\20.18_IO.avi下载到目录F：\jiang.mp4（对字节流中常见的视频文件的上传和下载）
 *
 * @author: kejl
 * @create: 2020-09-28 18:53
 */
public class Test {

    /**
     * 方式1：基本字节流一次只读一个数据:
     * 进行字节流的复制 耗时：18222
     */
    void test01(){
        //记录线程开始运行的时间
        long Start =  System.currentTimeMillis();

      //创建字节输入流对象
        FileInputStream fis;

      //创建字节输出流对象
        FileOutputStream fos;
        try {
            fis = new FileInputStream("f:\\20.18_IO.avi");
            fos = new FileOutputStream("jiang.mp4");

        //对字节流的读写（读取，赋值，判断）

            int by = 0;
            while((by=fis.read())!=-1){
                fos.write(by);
            }

         //释放资源
            if(null!=fos){
                fos.close();
            }
            if(null!=fis){
                fis.close();
            }
        }catch(IOException ioe){
            ioe.printStackTrace();
        }
        long end = System.currentTimeMillis();
        System.out.println("共耗时间是："+(end-Start)+"毫秒");
    }

    /**
     * 高效字节流一次只读一个字节数据:
     * 耗时153
     */
    void test02(){
        long Start =  System.currentTimeMillis();
        FileInputStream fis;
        FileOutputStream fos;
        try {
            fis = new FileInputStream("f:\\20.18_IO.avi");
            BufferedInputStream bis =new BufferedInputStream(fis);
            fos = new FileOutputStream("jiang.mp4");
            BufferedOutputStream bos= new BufferedOutputStream(fos);
            int by = 0;
            while((by=bis.read())!=-1){
                bos.write(by);
            }
            if(null!=fos){
                bos.close();
            }
            if(null!=fis){
                bis.close();
            }
        }catch(IOException ioe){
            ioe.printStackTrace();
        }
        long end = System.currentTimeMillis();
        System.out.println("共耗时间是："+(end-Start)+"毫秒");
    }

  //  方法1和方法2对比，可见高效字节缓冲流对数据的传送是指数级的差别。


    /**
     * 高效字节流一次只读一个数据 耗时43
     */
  void  test03() {
      long Start =  System.currentTimeMillis();
      FileInputStream fis;
      FileOutputStream fos;
      try {
          fis = new FileInputStream("f:\\20.18_IO.avi");
          fos = new FileOutputStream("jiang.mp4");
//            int by = 0;
//            while((by=fis.read())!=-1){
//                          fos.write(by);
//             }
          byte[] bys = new byte[1024];
          int len =0;
          while((len = fis.read(bys))!=-1){
              fos.write(bys, 0, len);
          }
          if(null!=fos){
              fos.close();
          }
          if(null!=fis){
              fis.close();
          }
      }catch(IOException ioe){
          ioe.printStackTrace();
      }
      long end = System.currentTimeMillis();
      System.out.println("共耗时间是："+(end-Start)+"毫秒");
  }

    /**
     * 高效字节流一次只读一个数组 耗时12
     */
  void test04() {
      long Start =  System.currentTimeMillis();
      FileInputStream fis;
      FileOutputStream fos;
      try {
          fis = new FileInputStream("f:\\20.18_IO.avi");
          BufferedInputStream bis = new BufferedInputStream(fis);
          fos = new FileOutputStream("jiang.mp4");
          BufferedOutputStream bos = new BufferedOutputStream(fos);
//            int by = 0;
//            while((by=fis.read())!=-1){
//                          fos.write(by);
//             }
          byte[] bys = new byte[1024];
          int len =0;
          while((len = bis.read(bys))!=-1){
              bos.write(bys, 0, len);
          }
          if(null!=fos){
              bos.close();
          }
          if(null!=fis){
              bis.close();
          }
      }catch(IOException ioe){
          ioe.printStackTrace();
      }
      long end = System.currentTimeMillis();
      System.out.println("共耗时间是："+(end-Start)+"毫秒");
  }

  // BufferedOutputStream:字节缓冲输出流
  // 字节--文件内容的写入：
    void test05() throws IOException {
        FileOutputStream fos = new FileOutputStream("10_IO\\a.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        bos.write("我把数据写入到内部缓冲区中".getBytes());
        bos.close();

    }

    //BufferedInputStream:字节缓冲输入流
    // 字节--文件内容的读入

   void test06() throws IOException {
       FileInputStream fis = new FileInputStream("10_IO\\a.txt");
       BufferedInputStream bis = new BufferedInputStream(fis);
       //int read()从输入流中读取数据的下一个字节。
        /*int len = 0;//记录每次读取到的字节
        while((len = bis.read())!=-1){
            System.out.println(len);
        }*/

       //int read(byte[] b) 从输入流中读取一定数量的字节，并将其存储在缓冲区数组 b 中。
       byte[] bytes =new byte[1024];//存储每次读取的数据
       int len = 0; //记录每次读取的有效字节个数
       while((len = bis.read(bytes))!=-1){
           System.out.println(new String(bytes,0,len));
       }
       //4.释放资源
       bis.close();
   }

   //BufferedInputStream:字节缓冲输入流
    //字符的的写入
    void test07() throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("10_IO\\c.txt"));
        for (int i = 0; i <10 ; i++) {
            bw.write("传智播客");
            //bw.write("\r\n");
            bw.newLine();
        }
        bw.close();

    }

    //BufferedReader:字符缓冲输入流
   void  test08() throws IOException {
       BufferedReader br = new BufferedReader(new FileReader("10_IO\\c.txt"));

       //2.使用字符缓冲输入流对象中的方法read/readLine读取文本
        /*String line = br.readLine();
        System.out.println(line);

        line = br.readLine();
        System.out.println(line);

        line = br.readLine();
        System.out.println(line);

        line = br.readLine();
        System.out.println(line);*/

        /*
            发下以上读取是一个重复的过程,所以可以使用循环优化
            不知道文件中有多少行数据,所以使用while循环
            while的结束条件,读取到null结束
         */
       String line;
       while((line = br.readLine())!=null){
           System.out.println(line);
       }

       //3.释放资源
       br.close();
   }

   //文件的复制
   // 字节流+缓冲流实例
   void test09() throws IOException {
       long s = System.currentTimeMillis();
       FileInputStream fis = new FileInputStream("c:\\1.jpg");
       FileOutputStream fos = new FileOutputStream("d:\\1.jpg");
       //一次读取一个字节写入一个字节的方式
        /*int len = 0;
        while((len = fis.read())!=-1){
            fos.write(len);
        }*/

       //使用数组缓冲读取多个字节,写入多个字节
       byte[] bytes = new byte[1024];
       int len = 0;//每次读取的有效字节个数
       while((len = fis.read(bytes))!=-1){
           fos.write(bytes,0,len);
       }

       //5.释放资源(先关写的,后关闭读的;如果写完了,肯定读取完毕了)
       fos.close();
       fis.close();
       long e = System.currentTimeMillis();
       System.out.println("复制文件共耗时:"+(e-s)+"毫秒");
    }

    //字符流 输入
    void test10() throws IOException {
        FileReader fr=new FileReader(new File("1.txt"));
        char[] ca=new char[1024];
        int count=0;
        while((count=fr.read(ca))!=-1) {
            System.out.println(new String(ca,0,count));
        }

    }

    //字符输出：
    void test11() throws IOException {
        FileReader fr=new FileReader(new File("1.txt"));
        FileWriter fw=new FileWriter(new File("2.txt"));
        char[] ca=new char[1024];
        int count;
        while((count=fr.read(ca))!=-1) {
            fw.write(ca,0,count);
        }
        fr.close();
        fw.close();
    }

    //缓冲区字符
    void test12() throws IOException {
        BufferedReader br=new BufferedReader(new FileReader(new File("1.txt")));
        String value;
        while((value=br.readLine())!=null) {
            System.out.println(value);
        }
        br.close();
    }

   void  test13() throws IOException {

       BufferedWriter bw=new BufferedWriter(new FileWriter("3.txt"));
       BufferedReader br=new BufferedReader(new FileReader("1.txt"));
       String value="";
       while((value=br.readLine())!=null) {
           bw.write(value);
           bw.newLine();
       }
       bw.close();
       br.close();
    }

    //不同的编码
    void test14() throws IOException {
        // BufferedReader br=new BufferedReader(new FileReader(new File("C:\\Users\\Administrator\\Desktop\\6.txt")));
        // 改进
        BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\6.txt")),"gbk"));
        String st = br.readLine();
        System.out.println(st);
    }




}











